package cn.learn.lombokdemo;

import lombok.Getter;
import lombok.ToString;

/**
 * 使用fluent属性，getter和setter方法的方法名都是属性名，且setter方法返回当前对象
 * 使用chain属性，setter方法返回当前对象
 *
 * @author huangyezhan
 * @date 2020年02月27日0:35
 */
//@Setter
@Getter
//@Accessors(fluent = true)
//@Builder
@ToString
public class User {

    private String  username;
    private Integer age;
    private String  adrr;


    public User() {
    }

    public User(String username, Integer age, String adrr) {
        this.username = username;
        this.age = age;
        this.adrr = adrr;
    }

    //=======================================@Accessors的实现代码==============================================

    /**
     * fluent的属性,getter和setter方法的方法名都是属性名，且setter方法返回当前对象
     * 以下就是便签的实现
     */
    public String username() {
        return username;
    }

    public User username(String username) {
        this.username = username;
        return this;
    }

    public Integer age() {
        return age;
    }

    public User age(Integer age) {
        this.age = age;
        return this;
    }

    public String adrr() {
        return adrr;
    }

    public User adrr(String adrr) {
        this.adrr = adrr;
        return this;
    }


    //=======================================@Builder的实现代码==============================================

    /**
     * 使用场景：
     * builder设计模式可以用来设置一些对安全性要求你比较高的
     * 外面属性：设置成不可改的；
     * 内部类属性：用内部类属性来set值
     * 这样赋值以后就不能更改了
     * <p>
     * 缺点：
     * 如果一般的实体类都这样做【可改属性值的】这样会消耗多一点性能，创建的对象会比较多
     */
    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }

    public static class UserBuilder {
        private String  username;
        private String  adrr;
        private Integer age;

        UserBuilder() {
        }

        public User.UserBuilder username(String username) {
            this.username = username;
            return this;
        }

        public User.UserBuilder adrr(String adrr) {
            this.adrr = adrr;
            return this;
        }

        public User.UserBuilder age(Integer age) {
            this.age = age;
            return this;
        }


        public User build() {
            return new User(this.username, this.age, this.adrr);
        }

        @Override
        public String toString() {
            return "User.UserBuilder(username=" + this.username + ", age=" + this.age + ", password=" + this.adrr + ")";
        }
    }


}
